查看原文
其他

汽车信息安全--MCU启动常用密码算法

快乐的肌肉 汽车MCU软件设计 2024-03-08

目录

01.MCU安全启动加密算法选择

02.AES-CMAC详解

    2.1 子密钥的生成

    2.2 MAC生成

03.HMAC详解

04.数据填充



我们之前简单描述了汽车MCU常见的安全启动。这里我们就要对启动中所使用的加密算法进行描述。

首先我们来分析在MCU中安全启动时所需要的成员:

  1. 待校验对象(通常为应用程序)的数据长度、起始地址;

  2. 待校验对象进行校验时所需要的加密算法;

  3. 待校验对象进行校验时所需要的密钥;


有了上述三个成员,(注意:开始描述安全启动逻辑代码)启动的信任根(通常是HSM的BootRom)首先会查看待校验对象的数据长度和起始地址是否合法(通常就是范围判断),然后到slot中获取校验对象的验证密钥(思考下我这里为什么不说解密密钥而是说验证密钥?),最后将校验对象的数据按块放进硬件加速引擎进行处理,得出一个结果与预存在HSM NVM的结果(什么时候预存的?存到哪里的?)进行对比。


01.MCU安全启动加密算法选择

大家思考一个问题,在汽车MCU运行时代码通常都是直接在flash中运行,很少出现把一个功能栈拷贝到ram中运行,主要是MCU的SRAM通常十分珍贵,且比较小,虽然最近出来的片子S32G、TC3xx SRAM已经来到MB级别,但是鉴于成本、和芯片厂通常会将PFlash和CPU直连以加快取指速度,一般都还是采用比较传统的方式。

既然是直接取指,如果应用程序是加密存储在flash中,即使安全启动通过,应用程序解密完也没有足够的ram存放,所以一般来说,存放在flash中的代码均是以明文+签名or认证码的方式进行处理。

因此,汽车网络安全工程师最熟悉的AES128-CMAC来了


02.AES-CMAC详解

首先我们来回顾什么是AES(advanced encryption standard)加密算法。

AES屁股后面跟的工作模式通常是CBC\CFB这些,这个CMAC是个啥?

来看下全称:Cipher-based Message Authentication Code。我们知道MAC本身就是与密码相关的Hash,它不仅提供了比crc这类算法更强的数据完整性保护,还防止了数据未经允许的修改、破坏等(验证数据来源)。为什么呢?因为MAC就是将密钥和明文使用某种算法共同计算出一个值,只有知道密钥的接收方才能计算出与之匹配的值;即使密钥被攻击者破解,由于MAC的hash属性,攻击者是无法反推出数据的。所以我们在SecOC里面最常用的还是AES128-CMAC外加FvM防止重放攻击。

本质上,AES-CMAC和OMAC1(一种改进的CBC-MAC算法)相同,使用一个私密的密钥、可变长度的消息数据(对齐该消息按照固定长度进行分块计算),最终返回一个固定长度的值,这个值我们叫做MAC。

以下链接:

https://datatracker.ietf.org/doc/html/rfc4493#ref-NIST-CMAC

2.1 子密钥的生成        

对于CMAC来说,存在数据长度不是128bit整数倍的情况,因此,这个算法流程有两种,如下:

case a :消息数据是128bit的整数倍,使用私密密钥k1生成MAC(T);

case b:消息数据不能整除,使用私密密钥k2生成MAC(T);

        而私密密钥的生成又是按照如下方式生成:

  1. 初始向量IV(0) + 原始key,使用AES-128-CBC,生成一个中间输出L;

  2. 判断该L最高位是否等于0;如果等于0,k1 = L << 1;否则,k1 = (L << 1)XOR 0x87(Rb_const);

  3. 判断k1的最高位是否等于0;如果等于0,k2 = k1 << 1;否则,k2 = (L << 1)XOR 0x87(Rb_const);


同时对于上述两个case,使用k1或者k2生成消息数据最后一块的数据。

需要注意的是,当处于case b时,M_last是需要进行填充的,填充方式参考04.数据填充

2.2 MAC生成算法

使用AES-CMAC进行计算,需要三个输入:私密密钥(k)、消息数据、消息数据长度;具体操作流程如下:

仅在最后一步使用的明文分组生成AES-CMAC。

可以选择直接把明文组包+CMAC发给接收方,也可以用密文+CMAC。



03.HMAC详解

HMAC(Hash-based Message Authentication Code):Hash函数是公开的,因此直接使用无密钥的Hash对数据处理,只能保证数据的完整性。如果加上MAC值,那么就可以验证数据的来源有效。MD-5和SHA-1就是这种hash函数的示例。

参考链接如下:https://datatracker.ietf.org/doc/html/rfc2104


04.数据填充

我们发现,在使用上述算法进行计算时,AES都是以一个块进行计算,如果此时要计算的数据分组后最后一块不够128bit,就要进行填充,常见填充方式(假设数据块为8个byte)如下:

  • 全0填充

填充结构:

Data:| 11 11 11 11 11 11 11 11 | 11 11 00 00 00 00 00 00 |


  • PKCS#7填充

每一个字节都表示填充的长度,如下:

| 11 11 11 11 11 11 11 11 | 11 11 06 06 06 06 06 06 |


  • ANSI X.923 填充

该方式用0进行填充,但用最后一个字节表示填充的长度,如下:

| AA AA AA AA AA AA AA AA | AA AA 00 00 00 00 00 06 |


往期回顾:

1.汽车标定合集

汽车标定文章合集
汽车标定技术--A2L格式分析
汽车标定技术--XCP协议如何支持测量功能
硬核:汽车标定--多周期测量显示异常汽车标定技术--MPC57xx是如何支持标定的页切换

2.AUTOSAR合集

AUTOSAR OS概述(一)
AUTOSAR OS概述(二)
AUTOSAR 通信栈分析(一)
AUTOSAR文章合集
Flash模拟EEPROM原理浅析

3.汽车网络安全合集

汽车网络安全方案产品交付形态的思考
汽车网络安全方案需求分析
车载信息安全场景概述
汽车网络安全渗透测试概述
汽车网络安全文章合集

4.汽车功能安全合集


5.汽车虚拟化合集

    汽车ECU虚拟化技术初探(一)

6.杂七杂八

    我为什么开始写技术博客


继续滑动看下一个

汽车信息安全--MCU启动常用密码算法

快乐的肌肉 汽车MCU软件设计
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存